/**
 * AI动态提示生成服务
 * 根据用户主题和问题类型，智能生成个性化的提示内容
 */

import { QuestionPurpose } from '@/types/brainstorm';

interface DynamicHints {
  hints: string[];
  examples: string[];
  tips: string[];
}

interface GenerateHintsParams {
  topic: string;              // 用户输入的主题
  purpose: QuestionPurpose;   // 问题类型
  hotTopicData?: {           // 热点数据（如果有）
    title: string;
    platform: string;
    tags: string[];
    heatValue: number;
  };
  context?: {                // 上下文信息
    previousAnswers?: Record<string, string>;  // 之前的回答
    targetAudience?: string;                   // 目标读者（如果已回答）
    modelId?: string;                           // 选择的模型ID
  };
}

class AIHintService {
  private baseUrl: string;

  constructor() {
    // 使用相对路径，让Vite代理处理
    this.baseUrl = '';
  }

  /**
   * 生成动态提示
   */
  async generateDynamicHints(params: GenerateHintsParams): Promise<DynamicHints> {
    try {
      // 尝试调用API
      const response = await fetch(`${this.baseUrl}/api/v1/ai/generate-hints`, {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({
          topic: params.topic,
          purpose: params.purpose,
          platform: params.hotTopicData?.platform,
          model_id: params.context?.modelId,  // 传递模型ID
        }),
      });

      if (response.ok) {
        const data = await response.json();
        return {
          hints: data.hints || [],
          examples: data.examples || [],
          tips: data.tips || [],
        };
      }
    } catch (error) {
      console.warn('API call failed, using smart defaults:', error);
    }

    // API失败时使用智能生成方案
    return this.generateSmartDefaultHints(params);
  }

  /**
   * 构建生成提示的Prompt
   */
  private buildPromptForHints(params: GenerateHintsParams): string {
    const { topic, purpose, hotTopicData, context } = params;

    const purposeDescriptions = {
      audience: '目标读者定位',
      viewpoint: '核心观点确定',
      material: '素材和案例收集',
      style: '写作风格选择',
      goal: '期望效果设定',
    };

    let prompt = `用户想要创作关于"${topic}"的文章。\n`;
    prompt += `当前需要回答的问题类型是：${purposeDescriptions[purpose]}\n\n`;

    // 如果有热点数据
    if (hotTopicData) {
      prompt += `这是一个${hotTopicData.platform}平台的热点话题，热度${hotTopicData.heatValue}%。\n`;
      prompt += `相关标签：${hotTopicData.tags.join('、')}\n\n`;
    }

    // 如果有上下文
    if (context?.targetAudience) {
      prompt += `已确定的目标读者：${context.targetAudience}\n\n`;
    }

    // 根据问题类型定制提示生成要求
    prompt += this.getPromptByPurpose(purpose, topic);

    prompt += `\n请生成以下内容（以JSON格式返回）：
1. hints: 4个思考方向或要点（每个10-20字）
2. examples: 4个具体的参考示例（每个20-40字，要贴合主题"${topic}"）
3. tips: 3个实用的写作建议（每个15-30字）

要求：
- 所有内容都要紧密围绕"${topic}"这个主题
- 示例要具体、实用，可以直接使用
- 建议要有针对性，避免空泛
- 语言简洁明了，容易理解`;

    return prompt;
  }

  /**
   * 根据问题类型生成特定的Prompt部分
   */
  private getPromptByPurpose(purpose: QuestionPurpose, topic: string): string {
    const prompts: Record<QuestionPurpose, string> = {
      audience: `
针对"${topic}"这个主题，帮助用户思考：
- 谁会对这个话题感兴趣？
- 他们的特征是什么？
- 他们的需求和痛点是什么？
- 他们希望获得什么信息？`,

      viewpoint: `
针对"${topic}"这个主题，帮助用户思考：
- 可以从哪些独特角度切入？
- 有什么不同于主流的观点？
- 核心论点是什么？
- 如何让观点更有说服力？`,

      material: `
针对"${topic}"这个主题，帮助用户思考：
- 需要哪些数据支撑？
- 有哪些相关的案例？
- 可以引用哪些权威观点？
- 自己有什么相关经历？`,

      style: `
针对"${topic}"这个主题，帮助用户思考：
- 什么风格最适合这个话题？
- 目标读者喜欢什么样的表达？
- 是严肃分析还是轻松叙述？
- 如何让文章更有吸引力？`,

      goal: `
针对"${topic}"这个主题，帮助用户思考：
- 读者看完能获得什么？
- 想要传达什么价值？
- 期望产生什么影响？
- 如何让效果可衡量？`,
    };

    return prompts[purpose] || prompts.viewpoint;
  }

  /**
   * 解析AI返回的响应
   */
  private parseAIResponse(data: any): DynamicHints {
    try {
      // 如果AI返回的是结构化数据
      if (data.hints && data.examples && data.tips) {
        return {
          hints: data.hints,
          examples: data.examples,
          tips: data.tips,
        };
      }

      // 如果AI返回的是文本，尝试解析
      if (data.content) {
        const parsed = JSON.parse(data.content);
        return {
          hints: parsed.hints || [],
          examples: parsed.examples || [],
          tips: parsed.tips || [],
        };
      }
    } catch (error) {
      console.error('Failed to parse AI response:', error);
    }

    // 解析失败，返回空数组
    return {
      hints: [],
      examples: [],
      tips: [],
    };
  }

  /**
   * 智能生成默认提示（降级方案）
   */
  private generateSmartDefaultHints(params: GenerateHintsParams): DynamicHints {
    const { topic, purpose, hotTopicData } = params;

    // 基于主题关键词生成相关提示
    const keywords = this.extractKeywords(topic);

    // 分析主题类型
    const topicType = this.analyzeTopicType(topic);

    // 根据热点数据调整
    const heatModifier = hotTopicData?.heatValue ? (hotTopicData.heatValue > 80 ? '热门' : '新兴') : '';

    // 根据问题类型和主题生成提示
    switch (purpose) {
      case 'audience':
        return {
          hints: this.generateAudienceHints(keywords, topicType, heatModifier),
          examples: this.generateAudienceExamples(topic, keywords, topicType),
          tips: this.generateAudienceTips(topic, keywords, hotTopicData?.platform),
        };

      case 'viewpoint':
        return {
          hints: this.generateViewpointHints(keywords, topicType),
          examples: this.generateViewpointExamples(topic, keywords, topicType),
          tips: this.generateViewpointTips(topic, keywords),
        };

      case 'material':
        return {
          hints: this.generateMaterialHints(keywords, topicType),
          examples: this.generateMaterialExamples(topic, keywords, topicType),
          tips: this.generateMaterialTips(topic, keywords),
        };

      case 'style':
        return {
          hints: this.generateStyleHints(topicType),
          examples: this.generateStyleExamples(topic, topicType),
          tips: this.generateStyleTips(topic, topicType, hotTopicData?.platform),
        };

      case 'goal':
        return {
          hints: this.generateGoalHints(keywords, topicType),
          examples: this.generateGoalExamples(topic, keywords, topicType),
          tips: this.generateGoalTips(topic, keywords),
        };

      default:
        return {
          hints: [],
          examples: [],
          tips: [],
        };
    }
  }

  /**
   * 分析主题类型
   */
  private analyzeTopicType(topic: string): 'tech' | 'business' | 'life' | 'culture' | 'general' {
    const techKeywords = ['技术', '科技', 'AI', '人工智能', '芯片', '互联网', '数字', '智能', '算法', '数据', '软件', '硬件', '云', '5G', '区块链'];
    const businessKeywords = ['商业', '经济', '市场', '投资', '创业', '企业', '管理', '营销', '品牌', '战略', '产业'];
    const lifeKeywords = ['生活', '健康', '教育', '家庭', '育儿', '美食', '旅游', '健身', '养生', '情感'];
    const cultureKeywords = ['文化', '艺术', '历史', '文学', '电影', '音乐', '设计', '时尚', '娱乐'];

    if (techKeywords.some(kw => topic.includes(kw))) return 'tech';
    if (businessKeywords.some(kw => topic.includes(kw))) return 'business';
    if (lifeKeywords.some(kw => topic.includes(kw))) return 'life';
    if (cultureKeywords.some(kw => topic.includes(kw))) return 'culture';
    return 'general';
  }

  /**
   * 生成目标读者相关提示
   */
  private generateAudienceHints(keywords: string[], topicType: string, heatModifier: string): string[] {
    const baseHints = {
      tech: ['技术从业者和开发者', '科技爱好者和极客', '产品经理和设计师', '投资人和创业者'],
      business: ['企业管理者和决策者', '创业者和投资人', '市场营销人员', '商业分析师'],
      life: ['关注生活品质的都市人群', '年轻家庭和父母', '健康生活追求者', '自我提升爱好者'],
      culture: ['文化艺术爱好者', '创意工作者', '年轻潮流群体', '知识分子群体'],
      general: ['对新知识感兴趣的大众', '相关行业从业者', '学生和研究者', '普通消费者'],
    };

    const hints = baseHints[topicType as keyof typeof baseHints] || baseHints.general;

    // 根据关键词定制
    if (keywords.length > 0) {
      hints[0] = `对${keywords[0]}感兴趣的${hints[0]}`;
      if (heatModifier) {
        hints[1] = `关注${heatModifier}话题的${hints[1]}`;
      }
    }

    return hints;
  }

  private generateAudienceExamples(topic: string, keywords: string[], topicType: string): string[] {
    const examples = [
      `在${keywords[0] || topic}领域工作的专业人士`,
      `对${topic}有实际需求的用户群体`,
      `关注${keywords[1] || keywords[0] || topic}发展趋势的观察者`,
      `希望了解${topic}的初学者或爱好者`,
    ];

    // 根据类型调整
    if (topicType === 'tech') {
      examples[0] = `具有编程背景，对${keywords[0] || topic}技术感兴趣的工程师`;
    } else if (topicType === 'business') {
      examples[0] = `需要${keywords[0] || topic}解决方案的企业管理者`;
    }

    return examples;
  }

  private generateAudienceTips(topic: string, keywords: string[], platform?: string): string[] {
    const tips = [
      `💡 考虑${topic}的专业程度和门槛`,
      `💡 分析不同群体对${keywords[0] || topic}的关注点`,
      `💡 思考读者阅读这篇文章的场景和动机`,
    ];

    // 根据平台调整
    if (platform === 'zhihu') {
      tips[2] = '💡 知乎用户偏好深度内容和专业分析';
    } else if (platform === 'xiaohongshu') {
      tips[2] = '💡 小红书用户注重实用性和生活化';
    }

    return tips;
  }

  /**
   * 生成观点相关提示
   */
  private generateViewpointHints(keywords: string[], topicType: string): string[] {
    return [
      `${keywords[0] || '这个话题'}的独特价值和意义`,
      `从不同角度分析${keywords[1] || keywords[0] || '问题'}`,
      `${topicType === 'tech' ? '技术发展' : '行业变革'}带来的机遇`,
      `未来趋势和可能的影响`,
    ];
  }

  private generateViewpointExamples(topic: string, keywords: string[], topicType: string): string[] {
    const examples = [
      `${topic}不只是表面现象，背后反映了深层变革`,
      `从${topicType === 'tech' ? '技术演进' : '社会发展'}角度看${keywords[0] || topic}`,
      `${topic}将如何改变我们的${topicType === 'life' ? '生活方式' : '工作模式'}`,
      `为什么说${keywords[0] || topic}是不可逆转的趋势`,
    ];

    return examples;
  }

  private generateViewpointTips(topic: string, keywords: string[]): string[] {
    return [
      `💡 提出对${topic}的独特见解，避免人云亦云`,
      `💡 用批判性思维分析${keywords[0] || topic}`,
      `💡 结合实际案例支撑你的观点`,
    ];
  }

  /**
   * 生成素材相关提示
   */
  private generateMaterialHints(keywords: string[], topicType: string): string[] {
    const hints = {
      tech: ['技术白皮书和研究报告', '开源项目和代码案例', '行业大会和技术分享', '专家博客和论文'],
      business: ['市场调研报告', '成功企业案例', '行业数据统计', '商业模式分析'],
      life: ['生活实践经验', '用户真实反馈', '相关调查数据', '专家建议指南'],
      culture: ['历史文献资料', '艺术作品赏析', '文化现象观察', '社会调查研究'],
      general: ['权威机构报告', '典型案例分析', '数据统计资料', '专家观点引用'],
    };

    return hints[topicType as keyof typeof hints] || hints.general;
  }

  private generateMaterialExamples(topic: string, keywords: string[], topicType: string): string[] {
    return [
      `关于${topic}的最新行业报告或白皮书`,
      `${keywords[0] || topic}领域的成功案例或失败教训`,
      `权威机构发布的${keywords[1] || keywords[0] || topic}相关数据`,
      `自己或他人在${topic}方面的亲身经历`,
    ];
  }

  private generateMaterialTips(topic: string, keywords: string[]): string[] {
    return [
      `💡 优先使用最新的${topic}相关资料`,
      `💡 注意数据来源的权威性和可信度`,
      `💡 结合多个角度的素材，增强说服力`,
    ];
  }

  /**
   * 生成风格相关提示
   */
  private generateStyleHints(topicType: string): string[] {
    const hints = {
      tech: ['技术文档式的严谨风格', '科普解说的通俗风格', '案例分析的实践风格', '前沿探索的创新风格'],
      business: ['商业分析的专业风格', '案例故事的叙事风格', '数据驱动的理性风格', '战略思维的宏观风格'],
      life: ['温馨亲切的对话风格', '实用指南的教程风格', '个人分享的随笔风格', '轻松幽默的娱乐风格'],
      culture: ['文学性的优美风格', '学术性的严谨风格', '评论性的批判风格', '科普性的通俗风格'],
      general: ['清晰明了的说明风格', '生动有趣的叙述风格', '逻辑严密的论证风格', '简洁有力的观点风格'],
    };

    return hints[topicType as keyof typeof hints] || hints.general;
  }

  private generateStyleExamples(topic: string, topicType: string): string[] {
    const baseStyle = topicType === 'tech' ? '技术' : topicType === 'business' ? '商业' : '通俗';

    return [
      `用${baseStyle}术语准确描述${topic}的专业风格`,
      `通过故事和案例展现${topic}的叙事风格`,
      `用数据和图表分析${topic}的理性风格`,
      `轻松幽默地探讨${topic}的趣味风格`,
    ];
  }

  private generateStyleTips(topic: string, topicType: string, platform?: string): string[] {
    const tips = [
      `💡 风格要与${topic}的内容性质相匹配`,
      `💡 考虑目标读者的阅读习惯和偏好`,
      `💡 保持全文风格的一致性`,
    ];

    if (platform) {
      const platformStyles: Record<string, string> = {
        zhihu: '知乎偏好有深度的分析风格',
        weibo: '微博适合简短有力的观点风格',
        xiaohongshu: '小红书喜欢图文并茂的分享风格',
      };
      if (platformStyles[platform]) {
        tips[1] = `💡 ${platformStyles[platform]}`;
      }
    }

    return tips;
  }

  /**
   * 生成目标相关提示
   */
  private generateGoalHints(keywords: string[], topicType: string): string[] {
    return [
      `让读者深入理解${keywords[0] || '核心概念'}`,
      `改变读者对${keywords[1] || keywords[0] || '这个话题'}的认知`,
      `激发读者的${topicType === 'tech' ? '学习兴趣' : '行动意愿'}`,
      `提供可实践的解决方案`,
    ];
  }

  private generateGoalExamples(topic: string, keywords: string[], topicType: string): string[] {
    return [
      `读者能够掌握${topic}的核心要点和关键概念`,
      `理解${keywords[0] || topic}背后的原理和逻辑`,
      `获得关于${topic}的实用建议和操作指南`,
      `形成对${keywords[1] || keywords[0] || topic}的独立思考`,
    ];
  }

  private generateGoalTips(topic: string, keywords: string[]): string[] {
    return [
      `💡 设定明确、可达成的学习目标`,
      `💡 考虑读者能从${topic}中获得什么价值`,
      `💡 提供可验证、可衡量的效果`,
    ];
  }

  /**
   * 提取主题关键词
   */
  private extractKeywords(topic: string): string[] {
    // 简单的关键词提取
    const words = topic
      .replace(/[的了在是和与及或等]/g, ' ')
      .split(/[\s，。！？；：""''（）\[\]{}【】]/g)
      .filter(word => word.length >= 2)
      .slice(0, 3);

    return words.length > 0 ? words : [topic];
  }

  /**
   * 批量生成问题提示
   */
  async generateBatchHints(
    topic: string,
    purposes: QuestionPurpose[],
    context?: any
  ): Promise<Record<QuestionPurpose, DynamicHints>> {
    try {
      // 尝试调用批量API
      const response = await fetch(`${this.baseUrl}/api/v1/ai/generate-hints/batch`, {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({
          topic,
          purposes,
          platform: context?.platform,
          model_id: context?.modelId,  // 传递模型ID
        }),
      });

      if (response.ok) {
        const data = await response.json();
        const results: Record<QuestionPurpose, DynamicHints> = {} as any;

        for (const purpose of purposes) {
          if (data[purpose]) {
            results[purpose] = {
              hints: data[purpose].hints || [],
              examples: data[purpose].examples || [],
              tips: data[purpose].tips || [],
            };
          }
        }

        // 如果有结果返回
        if (Object.keys(results).length > 0) {
          return results;
        }
      }
    } catch (error) {
      console.warn('Batch API call failed, using fallback:', error);
    }

    // API失败时，逐个生成
    const results: Record<QuestionPurpose, DynamicHints> = {} as any;

    // 并行生成所有问题的提示
    const promises = purposes.map(async (purpose) => {
      const hints = await this.generateDynamicHints({
        topic,
        purpose,
        context,
      });
      results[purpose] = hints;
    });

    await Promise.all(promises);
    return results;
  }
}

export const aiHintService = new AIHintService();